Passed
Push — master ( 6e3134...9d1f81 )
by Paul
04:23
created

GLSR.Tabs   A

Complexity

Conditions 5
Paths 2

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
nc 2
nop 1
dl 0
loc 9
rs 9.3333
c 0
b 0
f 0
1
/** global: GLSR, jQuery */
2
;(function( x ) {
3
4
	'use strict';
5
6
	GLSR.Tabs = function( options ) {
7
		this.options = x.extend( {}, this.defaults, options );
8
		this.active = document.querySelector( 'input[name=_active_tab]' );
9
		this.referrer = document.querySelector( 'input[name=_wp_http_referer]' );
10
		this.tabs = document.querySelectorAll( this.options.tabSelector );
11
		this.views = document.querySelectorAll( this.options.viewSelector );
12
		if( !this.active || !this.referrer || !this.tabs || !this.views )return;
13
		this.init_();
14
	};
15
16
	GLSR.Tabs.prototype = {
17
		defaults: {
18
			tabSelector: '.glsr-nav-tab',
19
			viewSelector: '.glsr-nav-view',
20
		},
21
22
		/** @return void */
23
		init_: function() {
24
			x( window ).on( 'hashchange', this.onHashchange_.bind( this ));
25
			[].forEach.call( this.tabs, function( tab, index ) {
26
				var active = location.hash ? tab.getAttribute( 'href' ).slice(1) === location.hash.slice(2) : index === 0;
27
				if( active ) {
28
					this.setTab_( tab );
29
				}
30
				tab.addEventListener( 'click', this.onClick_.bind( this ));
31
				tab.addEventListener( 'touchend', this.onClick_.bind( this ));
32
			}.bind( this ));
33
		},
34
35
		/** @return string */
36
		getAction_: function( bool ) {
37
			return bool ? 'add' : 'remove';
38
		},
39
40
		/** @return void */
41
		onClick_: function( ev ) {
42
			ev.preventDefault();
43
			ev.target.blur();
44
			this.setTab_( ev.target );
45
			location.hash = '!' + ev.target.getAttribute( 'href' ).slice(1);
46
		},
47
48
		/** @return void */
49
		onHashchange_: function() {
50
			var id = location.hash.split('#!')[1];
51
			for( var i = 0; i < this.views.length; i++ ) {
52
				if( id !== this.views[i].id )continue;
53
				this.setTab_( this.tabs[i] );
54
				break;
55
			}
56
		},
57
58
		/** @return void */
59
		setReferrer_: function( index ) {
60
			var referrerUrl = this.referrer.value.split('#')[0] + '#!' + this.views[index].id;
61
			this.referrer.value = referrerUrl;
62
		},
63
64
		/** @return void */
65
		setTab_: function( el ) {
66
			[].forEach.call( this.tabs, function( tab, index ) {
67
				var action = this.getAction_( tab === el );
68
				if( action === 'add' ) {
69
					this.active.value = this.views[index].id;
70
					this.setReferrer_( index );
71
					this.setView_( index );
72
				}
73
				tab.classList[action]( 'nav-tab-active' );
74
			}.bind( this ));
75
		},
76
77
		/** @return void */
78
		setView_: function( idx ) {
79
			[].forEach.call( this.views, function( view, index ) {
80
				var action = this.getAction_( index !== idx );
81
				view.classList[action]( 'ui-tabs-hide' );
82
			}.bind( this ));
83
		},
84
	};
85
})( jQuery );
86